#include "drawwidget.h"
#include<QDebug>
DrawWidget::DrawWidget(QWidget *parent) : QWidget(parent)
{
    setAutoFillBackground(true);
    setPalette(QPalette(Qt::white));
    pix = new QPixmap(size());
    pix->fill(Qt::white);
//    setMinimumSize(600, 400);
}
void DrawWidget::setStyle(int s){
    style = s;
}

void DrawWidget::setWidth(int w){
    weight = w;
}

void DrawWidget::setColor(QColor c){
    color = c;
}

void DrawWidget::clear(){
    QPixmap *clearPix = new QPixmap(size());
    clearPix->fill(Qt::white);
    pix = clearPix;
    update();
}
/*
 * 重新定义鼠标按下事件，在按下鼠标时，记录当前鼠标位置值
 * */
void DrawWidget::mousePressEvent(QMouseEvent *event){
    startPos = event->pos();
}
/*
 * 重新定义鼠标移动事件，在鼠标移动事件默认情况下，在鼠标按下的平时拖拽鼠标触发
 * */
void DrawWidget::mouseMoveEvent(QMouseEvent *event){
    QPainter* painter = new QPainter;
    QPen pen;
    pen.setStyle((Qt::PenStyle)style); //  设置笔画的线型，Qt::PenStyle是一个枚举类型，选中第style个元素
    pen.setWidth(weight);
    pen.setColor(color);

    /*
     * 以QPixmap对象作为QPaintDevice参数绘制。
     * */
    painter->begin(pix);    // Begins painting thepaint device and return true if successful
    painter->setPen(pen);
    painter->drawLine(startPos, event->pos());// 绘制从startPos到鼠标当前位置的直线
    painter->end();         // Ends ppaintings. Any resources used while painting are released.

    startPos = event->pos();;
    update();

}
/*
 * 重写函数paintEvent完成绘制窗体的更新工作
 * 只需要调用drawpixmap函数将用于接收图形绘制QPixmao对象绘制在绘制区窗体控件上
 * */
void DrawWidget::paintEvent(QPaintEvent *){
    QPainter painter(this);
    painter.drawPixmap(QPoint(0,0), *pix);
}
/*
 * 对于窗体的大小改变事件要重写
 * 因为窗体发生改变，而可绘制区域没有发生改变，绘制的图像也没有发生改变
 * 所以需要将可绘制区域以及图片都进行对应的改变
 * */
void DrawWidget::resizeEvent(QResizeEvent *event){
    if(height() > pix->height() || width() > pix->width()){
        QPixmap *newPix = new QPixmap(size());
        newPix->fill(Qt::white);
        QPainter p(newPix);
        p.drawPixmap(QPoint(0, 0 ), *pix);
        pix = newPix;
    }
    qDebug()<<"have Resize";
    QWidget::resizeEvent(event);        // 继承父类的事件还有其他操作需要进行，显示调用父类的事件触发
}
